@奈良山
3年前 提问
1个回答
concurrenthashmap实现原理
Ann
3年前
ConcurrentHashMap 实现原理
ConcurrentHashMap 的基本策略是将 table 细分为多个 Segment 保存在数组 segments 中,每个 Segment 本身又是一个可并发的哈希表,同时每个 Segment 都是一把 ReentrantLock 锁,只有在同一个 Segment 内才存在竞态关系,不同的 Segment 之间没有锁竞争,这就是分段锁机制。Segment 内部拥有一个 HashEntry 数组,数组中的每个元素又是一个链表。下面看看 ConcurrentHashMap 整体结构图:
为了减少占用空间,除了第一个 Segment 之外,剩余的 Segment 采用的是延迟初始化的机制,仅在第一次需要时才会创建(通过 ensureSegment 实现)。为了保证延迟初始化存在的可见性,访问 segments 数组及 table 数组中的元素均通过 volatile 访问,主要借助于 Unsafe 中原子操作 getObjectVolatile 来实现,此外,segments 中 segment 的写入,以及 table 中元素和 next 域的写入均使用 UNSAFE.putOrderedObject 来完成。这些操作提供了 AtomicReferenceArrays 的功能。